import 'package:flutter/material.dart';

import 'package:get/get.dart';
import 'package:getx_learn/app/common/widgets/widgets.dart';
import 'package:getx_learn/app/routes/app_pages.dart';

import '../controllers/get_view_and_get_widget_controller.dart';

class GetViewAndGetWidgetView extends GetView<GetViewAndGetWidgetController> {
  const GetViewAndGetWidgetView({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: getAppBar(context: context, title: "GetViewAndGetWidgetView"),
      body: ListView(
        children: [

          Text("""
          Flutter开发之——getX-获取视图的几种方式(13)
          https://blog.csdn.net/Calvin_zhou/article/details/124734226
          
          
          GetView：最常用，是个const Stateless Widget，GetView<Controller>绑定控制器后可直接使用
          GetResponsiveView：响应式视图，该视图包含screen属性，其中包含关于屏幕大小和类型的信息
          GetWidget：使用较少，不是个const Stateless视图，它缓存了一个控制器
          
          Flutter GetX系列教程-GetView 和 GetWidget
          https://www.bytezonex.com/archives/HBlmnINt.html
          轻松管理 Flutter 状态：GetView 和 GetWidget

简介

在 Flutter 开发中，管理应用程序状态至关重要。GetView 和 GetWidget 是两个强大的小部件，它们可以简化状态管理，并让你的代码更简洁、更易读。

GetView

什么是 GetView？

GetView 是一个仅限状态的无状态小部件，它为已注册的控制器提供了一个名为 "controller" 的 getter。它非常适合使用单个控制器作为依赖项的情况，因为你可以直接引用该控制器的变量，而无需使用 Get.find() 或 Get.put() 来获取控制器。

GetView 的好处

简洁的代码：GetView 消除了在构造函数中显式传递变量的需要，从而简化了代码。
易于阅读：GetView 允许你直接访问控制器中的变量，无需进行额外的查找。
GetWidget

什么是 GetWidget？

GetWidget 是一个状态有状态的小部件，它包含一个 GetView 并处理其生命周期。与 GetView 类似，GetWidget 也可以访问控制器变量，但它还允许你对用户交互做出反应。

GetWidget 的好处

状态管理：GetWidget 可以保存状态并在小部件重新构建时更新其 UI。
响应交互：你可以使用 GetWidget 来响应用户交互，例如按钮点击。
GetView 与 GetWidget

哪种小部件更适合我？

GetView 和 GetWidget 都非常有用，选择哪种小部件取决于你的具体需求。

GetView： 如果你需要一个简单的无状态小部件来显示数据，那么 GetView 是一个不错的选择。
GetWidget： 如果你需要一个更复杂的有状态小部件来响应用户交互，那么 GetWidget 是一个更好的选择。
示例

使用 GetView 显示计数器

class CounterView extends GetView<CounterController> {
  @override
  Widget build(BuildContext context) {
    return Text('Count: ${controller.count}');
  }
}
使用 GetWidget 创建带有按钮的计数器

class CounterWidget extends GetWidget<CounterController> {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Text('Count: ${controller.count}'),
        ElevatedButton(
          onPressed: () => controller.increment(),
          child: Text('Increment'),
        ),
      ],
    );
  }
}
          """),

          Divider(),
          ListTile(
            title: Text("常见问题解答"),
            subtitle: Text("""
            1. 什么时候应该使用 GetView 和 GetWidget？
            
            GetView：当需要显示数据且无需响应用户交互时。
            GetWidget：当需要响应用户交互且需要保存状态时。
            2. GetView 和 GetWidget 之间的主要区别是什么？
            
            GetView 是无状态的，而 GetWidget 是有状态的。
            GetView 无法响应用户交互，而 GetWidget 可以。
            3. 如何在 GetView 中获取控制器？
            
            使用 Get.find() 方法。
            
            4. 如何在 GetWidget 中访问控制器变量？
            
            直接使用它们。
            
            5. GetView 和 GetWidget 是否可以在一个应用程序中同时使用？
            
            是的，它们可以在一个应用程序中同时使用。
            """),
          ),

          Divider(),

          ListTile(
            title: Text("GetView的使用"),
            subtitle: Text("GetView只是对已注册的Controller有一个名为controller的getter的const Stateless的Widget"),
            onTap: (){
              Get.toNamed(Routes.GETX_VIEW_PAGE);
            },
          ),
          Divider(),

          ListTile(
            title: Text("GetWidget的使用"),
            subtitle: Text("它 “缓存 “了一个Controller，由于_cache_，不能成为一个 “const Stateless”（因为_cache_，所以不能成为一个const Stateless）"),
            onTap: (){
              Get.toNamed(Routes.GETX_WIDGET_PAGE);
            },
          ),
          Divider(),
        ],
      ),
    );
  }
}
